01 分式规划
我们需要求解这样的问题:给定长度为 的序列 和 (),求
或者说,给定 维列向量 和 (),求
其中 是一个行向量。这就是最基本的 01 分式规划问题。
问题转化
设分式等于 。即
设 。对于任意一个 ,都可以求出一条直线 。当 时,。
也就是说,平面上有若干条斜率为负的直线,要求出直线与 轴交点的最大值(最右边的点)。
二分法
假设随便取一个 。对于所有的 ,若存在 ,那么这条 与 轴的交点一定在 的右边。否则,没有交点在 的右边,答案一定在 左边。
这是一个很经典的二分答案的形式,所以就二分答案做了。关键是,如何判断存在 ?
其实就是判断 。就是,已知 ,要求 的最大值。这个就很简单了。将式子转化为 。显然贪心可以做,若 是正数我们就取,否则不取。
设答案精度为 (因为分式通常是小数答案),那么复杂度是 。
Dinkelbach
还是刚才的思路,仅略作改变。若 ,那么我们贪心地,顺着这条 找到它与 轴的交点,把这个交点作为新的 ,继续求解。这就是 Dinkelbach 算法。
Dinkelbach 解决 01 分数规划的复杂度是 ,并且有跑不满、常数小的优势。证明留坑待填。先放一个网上的证明:对于0-1分数规划的Dinkelbach算法的分析。
带限制的规划
有时候不一定是可以随便选。下面将提及几种带限制问题。
带限制问题,总体思路也不变,只是如何判断 罢了。
选不超过 个
这个简单。就在选正数的基础上,只选前 大的就可以了。
选择不能相邻
做一个 dp 即可。设 表示第 个选或未选,贡献的最大值。那么 。
选择有树形依赖
比如 Desert King 那道题。求一个最大生成树即可。
也有可能是树形 dp。
选择不超过 个,且不能相邻
做一个反悔贪心板子。类似题目:CTSC2007 数据备份。
选择的 的和有上下界
也就是, 这种。可以用背包 dp。板题:[USACO18OPEN] Talent Show G
只能选择连续一段,并且选择的 的和有上下界
连续一段可以前缀和。也就是判断是否存在 。移项可得 ,再变成是否存在 。
注意到每个 对应的 也是连续的一段,并且单调,可以双指针维护段的左右端点。然后单调队列滑动窗口求解。
总之 01 分式规划不难。但是将一个问题转化成 01 分式规划可能需要一定的思维。
感觉越写越水了。就讲到这里吧。